//
//  TaskPool.swift
//  Bee
//
//  Created by kyson on 15/12/31.
//  Copyright © 2015年 kyson. All rights reserved.
//

import UIKit

private let sharedInstance = TaskPool()

class TaskPool: NSObject {
    var group : dispatch_group_t!
    var queue : dispatch_queue_t!
    private var delegate: TaskPoolDelegate?
    var semaphore: dispatch_semaphore_t!
    class var sharedPool : TaskPool {
        return sharedInstance
    }
    
    override init() {
        group = dispatch_group_create()
        //创建一个信号
        semaphore = dispatch_semaphore_create(5);
        queue = dispatch_queue_create("com.cp", DISPATCH_QUEUE_CONCURRENT)
        
//        for var index = 0; index < 100;++index{
//            //等待信号
//            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
//            
//            dispatch_async(queue, { () -> Void in
//                //发送一个信号
//                dispatch_semaphore_signal(semaphore);
//            })
//            
//        }
//        //等待信号
//        dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    }
    
    func addDelegate(delegate:TaskPoolDelegate?){
        self.delegate = delegate
    }
    
    func doTask(service service :Service){
        
        /**
        Dispatch Queue是用来执行任务的队列，是GCD中最基本的元素之一。
        
        Dispatch Queue分为两种：
        
        Serial Dispatch Queue，按添加进队列的顺序（先进先出）一个接一个的执行
        Concurrent Dispatch Queue，并发执行队列里的任务
        简而言之，Serial Dispatch Queue只使用了一个线程，Concurrent Dispatch Queue使用了多个线程（具体使用了多少个，由系统决定）。 可以通过两种方式来获得Dispatch Queue，第一种方式是自己创建一个：
        
        let myQueue: dispatch_queue_t = dispatch_queue_create("com.xxx", nil)
        第一个参数是队列的名称，一般是使用倒序的全域名。虽然可以不给队列指定一个名称，但是有名称的队列可以让我们在遇到问题时更好调试；当第二个参数为nil时返回Serial Dispatch Queue，如上面那个例子，当指定为DISPATCH_QUEUE_CONCURRENT时返回Concurrent Dispatch Queue。
        */
        
        dispatch_async(self.queue) { () -> Void in
            dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER)
            service.start()
            
            
            
            
            dispatch_semaphore_signal(self.semaphore)
        }
        
        
        /**
        *需要注意一点，如果是在OS X 10.8或iOS 6以及之后版本中使用，Dispatch Queue将会由ARC自动管理，如果是在此之前的版本，需要自己手动释放，如下：
        let myQueue: dispatch_queue_t = dispatch_queue_create("com.xxx", nil)
        dispatch_async(myQueue, { () -> Void in
        println("in Block")
        })
        dispatch_release(myQueue)
        */
    }
    
    
    
    
    /**
    *以上是通过手动创建的方式来获取Dispatch Queue，第二种方式是直接获取系统提供的Dispatch Queue。 要获取的Dispatch Queue无非就是两种类型：
    
    Main Dispatch Queue
    Global Dispatch Queue / Concurrent Dispatch Queue
    一般只在需要更新UI时我们才获取Main Dispatch Queue，其他情况下用Global Dispatch Queue就满足需求了：
    
    /获取Main Dispatch Queue
    let mainQueue = dispatch_get_main_queue()
    //获取Global Dispatch Queue
    let globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
    得到的Global Dispatch Queue实际上是一个Concurrent Dispatch Queue，Main Dispatch Queue实际上就是Serial Dispatch Queue（并且只有一个）。 获取Global Dispatch Queue的时候可以指定优先级，可以根据自己的实际情况来决定使用哪种优先级。 一般情况下，我们通过第二种方式获取Dispatch Queue就行了。
    */
}


protocol TaskPoolDelegate{
    func taskPoolServiceDidFinished(service: Service,response: NetworkResponse)
    
}



